package br.com.mauricioreis.db;

import java.util.ArrayList;
import java.util.Calendar;
import java.util.List;

import android.app.Activity;
import android.content.ContentValues;
import android.database.Cursor;

public class Perfil extends Entidade {

    public static final String DATABASE_TABLE = "perfil";
    public static final String TABLE_CREATE = " create table perfil (id integer primary key autoincrement, "
            + "peso float not null, altura float not null, carboidrato float not null," + "proteina float not null,"
            + "gordura_total float not null," + "gordura_saturada float not null," + "fibra float not null," + "sodio float not null,"
            + "calcio float," + "ferro float," + "vitamina_c float, data_inclusao datetime); ";

    private static final String[] COLUMNS = new String[] { GenericDAO.KEY_ID, "peso", "altura", "carboidrato", "proteina", "gordura_total",
            "gordura_saturada", "fibra", "sodio", "calcio", "ferro", "vitamina_c", "data_inclusao" };

    public static final String SQL_PERFIL_PADRAO = "INSERT INTO perfil (" + "peso, altura, carboidrato, proteina, gordura_total, " + //
            "gordura_saturada, fibra, sodio, calcio, ferro, " + //
            "vitamina_c, data_inclusao) " + "VALUES (70 , 1.7, 300, 75, 55, 22, 25, 2.4, 1, 0.014, 0.045, '2011-11-07 11:00:00');";

    private int id;
    private Float peso;
    private Float altura;
    private Float carboidrato;
    private Float proteina;
    private Float gorduraTotal;
    private Float gorduraSaturada;
    private Float fibra;
    private Float sodio;
    private Float calcio;
    private Float ferro;
    private Float vitaminaC;
    private Calendar dataInclusao;

    public int getId() {
        return id;
    }

    public void setId(int id) {
        this.id = id;
    }

    public Float getPeso() {
        return peso;
    }

    public void setPeso(Float peso) {
        this.peso = peso;
    }

    public Float getAltura() {
        return altura;
    }

    public void setAltura(Float altura) {
        this.altura = altura;
    }

    public void setCarboidrato(Float carboidrato) {
        this.carboidrato = carboidrato;
    }

    public Float getCarboidrato() {
        return carboidrato;
    }

    public Float getProteina() {
        return proteina;
    }

    public void setProteina(Float proteina) {
        this.proteina = proteina;
    }

    public Float getGorduraTotal() {
        return gorduraTotal;
    }

    public void setGorduraTotal(Float gorduraTotal) {
        this.gorduraTotal = gorduraTotal;
    }

    public Float getGorduraSaturada() {
        return gorduraSaturada;
    }

    public void setGorduraSaturada(Float gorduraSaturada) {
        this.gorduraSaturada = gorduraSaturada;
    }

    public Float getFibra() {
        return fibra;
    }

    public void setFibra(Float fibra) {
        this.fibra = fibra;
    }

    public Float getSodio() {
        return sodio;
    }

    public void setSodio(Float sodio) {
        this.sodio = sodio;
    }

    public Float getCalcio() {
        return calcio;
    }

    public void setCalcio(Float calcio) {
        this.calcio = calcio;
    }

    public Float getFerro() {
        return ferro;
    }

    public void setFerro(Float ferro) {
        this.ferro = ferro;
    }

    public Float getVitaminaC() {
        return vitaminaC;
    }

    public void setVitaminaC(Float vitaminaC) {
        this.vitaminaC = vitaminaC;
    }

    public Calendar getDataInclusao() {
        return dataInclusao;
    }

    public void setDataInclusao(Calendar dataInclusao) {
        this.dataInclusao = dataInclusao;
    }

    public static Long incluir(Activity atividade, Perfil perfil) {

        GenericDAO dao = obtemDao(atividade);
        Long id = null;
        if (dao != null) {
            // seta a data de inclusão para data atual
            perfil.setDataInclusao(Calendar.getInstance());
            ContentValues values = toContentValue(perfil);
            id = dao.inserir(Perfil.DATABASE_TABLE, values);
            dao.close();
        }
        return id;
    }

    public static void editar(Activity atividade, Perfil perfil) {
        GenericDAO dao = obtemDao(atividade);
        ContentValues values = toContentValue(perfil);
        dao.atualizar(DATABASE_TABLE, perfil.getId(), values);
    }

    public static void excluir(Activity atividade, Perfil perfil) {
        GenericDAO dao = obtemDao(atividade);
        dao.deletar(DATABASE_TABLE, perfil.getId());
    }

    public static Perfil consultar(Activity atividade, Perfil perfil) {
        GenericDAO dao = obtemDao(atividade);
        Cursor cursor = dao.get(DATABASE_TABLE, COLUMNS, perfil.getId());
        perfil = cursorParaPerfil(cursor);
        return perfil;
    }

    public static List<Perfil> listar(Activity atividade, Perfil filtro) {
        Cursor cursor = null;
        List<Perfil> list = new ArrayList<Perfil>();
        GenericDAO dao = obtemDao(atividade);

        if (dao != null) {

            cursor = dao.get(Perfil.DATABASE_TABLE, Perfil.COLUMNS);

            if (cursor != null) {
                if (cursor.moveToFirst()) {

                    int count = cursor.getCount();

                    for (int i = 0; i < count; i++) {
                        Perfil perfilRet = cursorParaPerfil(cursor);
                        list.add(perfilRet);
                        cursor.moveToNext();
                    }
                }
            }
        }
        return list;
    }

    private static Perfil cursorParaPerfil(Cursor cursor) {
        int idColumn = cursor.getColumnIndex(GenericDAO.KEY_ID);
        int pesoColumn = cursor.getColumnIndex("peso");
        int alturaColumn = cursor.getColumnIndex("altura");
        int carboidratoColumn = cursor.getColumnIndex("carboidrato");
        int proteinaColumn = cursor.getColumnIndex("proteina");
        int gorduraTotalColumn = cursor.getColumnIndex("gordura_total");
        int gorduraSuturadaColumn = cursor.getColumnIndex("gordura_saturada");
        int fibraColumn = cursor.getColumnIndex("fibra");
        int sodioColumn = cursor.getColumnIndex("sodio");
        int calcioColumn = cursor.getColumnIndex("calcio");
        int ferroColumn = cursor.getColumnIndex("ferro");
        int vitaminaCColumn = cursor.getColumnIndex("vitamina_c");
        int dataInclusaoColumn = cursor.getColumnIndex("data_inclusao");
        Perfil perfilRet = new Perfil();

        perfilRet.setId(cursor.getInt(idColumn));
        perfilRet.setPeso(cursor.getFloat(pesoColumn));
        perfilRet.setAltura(cursor.getFloat(alturaColumn));
        perfilRet.setCarboidrato(cursor.getFloat(carboidratoColumn));
        perfilRet.setProteina(cursor.getFloat(proteinaColumn));
        perfilRet.setGorduraTotal(cursor.getFloat(gorduraTotalColumn));
        perfilRet.setGorduraSaturada(cursor.getFloat(gorduraSuturadaColumn));
        perfilRet.setFibra(cursor.getFloat(fibraColumn));
        perfilRet.setSodio(cursor.getFloat(sodioColumn));
        perfilRet.setCalcio(cursor.getFloat(calcioColumn));
        perfilRet.setFerro(cursor.getFloat(ferroColumn));
        perfilRet.setVitaminaC(cursor.getFloat(vitaminaCColumn));
        perfilRet.setDataInclusao(Util.stringParaCalendar(cursor.getString(dataInclusaoColumn)));

        return perfilRet;
    }

    private static ContentValues toContentValue(Perfil perfil) {
        ContentValues values = new ContentValues();
        values.put("peso", perfil.getPeso());
        values.put("altura", perfil.getAltura());
        values.put("carboidrato", perfil.getCarboidrato());
        values.put("proteina", perfil.getProteina());
        values.put("gordura_total", perfil.getGorduraTotal());
        values.put("gordura_saturada", perfil.getGorduraSaturada());
        values.put("fibra", perfil.getFibra());
        values.put("sodio", perfil.getSodio());
        values.put("calcio", perfil.getCalcio());
        values.put("ferro", perfil.getFerro());
        values.put("vitamina_c", perfil.getVitaminaC());
        values.put("data_inclusao", Util.calendarParaString(perfil.getDataInclusao()));
        return values;
    }

    private static GenericDAO obtemDao(Activity atividade) {
        return GenericDAO.getInstance(atividade, DATABASE_NAME, TABLE_CREATE, DATABASE_TABLE, DATABASE_VERSION);
    }

    @Override
    public String toString() {
        return this.dataInclusao.toString();

    }

    public static Perfil obtemUltimoPerfil(Activity atividade) {
        GenericDAO dao = obtemDao(atividade);
        String sql = "SELECT * FROM perfil " + //
                "ORDER BY strftime('%s', data_inclusao) DESC LIMIT 1;";
        Cursor cursor = dao.getComQuery(sql, null);

        return cursorParaPerfil(cursor);
    }

}
